import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

class User {
    public String username;
    public String password;
}

@WebServlet("/json")
public class JsonServlet extends HttpServlet {
    // 此处约定客户端body按照json格式来进行传输
    //具体格式形如:
    //    {
    //       username:"yzy",
    //       password:"233"
    //    }

    // 使用 jackson, 最核心的对象就是 ObjectMapper
    // 通过这个对象, 就可以把 json 字符串解析成 java 对象; 也可以把一个 java 对象转成(映射成)一个 json 格式字符串.
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过 post 请求的 body 传递过来一个 json 格式的字符串.
        //下面这一步完成了从字符串到对象之间的解析,即把字符串和user对象建立联系,把json里面的键值对设置到对应的user对象的属性里面
        //我们输入的是json字符串,得到的是一个user对象(但要求这两个内容是匹配的json里面有两个键值对username和password,则user对象中也要有username和password两个属性)
        User user = objectMapper.readValue(req.getInputStream(), User.class);
        System.out.println("username=" + user.username + ", password=" + user.password);


        //jackson 还提供了把java对象转成json字符串
        String userString = objectMapper.writeValueAsString(user);
        System.out.println("userString: "+userString);

        resp.getWriter().write("ok");
    }
}
